/*************************************************************************
** Desc		: 便于跨平台的一些宏
** Author	: xktesla@2016-11-18 20:49:54
*************************************************************************/

#ifndef _1E84D06B_061C_42E7_9553_A5758A2DE126
#define _1E84D06B_061C_42E7_9553_A5758A2DE126

#include "compile.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>  
#include <ctype.h>  
#include <time.h>  
#include <math.h>
#ifndef __X2LIB_MACOS__
#include <malloc.h>
#endif

#ifdef __X2LIB_WIN32__
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
//#include <lmerr.h>	// ????????????
//#include <winsdkver.h>
//#include <SDKDDKVer.h>
#include <windows.h>
#include <winsock2.h>
//#include <winsock.h> 
#include <winioctl.h>
#include <winternl.h>
#include <ws2tcpip.h>
#include <windns.h>
#include <intrin.h>
#include <dbghelp.h>
#include <tlhelp32.h>
#include <process.h>
#include <direct.h>  
#include <psapi.h>
#include <shlobj.h>
#include <shellapi.h>
#include <iphlpapi.h>
//#include <tlhelp32.h>  
//#include <shellapi.h>
#include <tchar.h>
#include <io.h>
#include <strsafe.h>
#include <stdarg.h>
#include <direct.h>  
#include <sys/timeb.h> 
#include <fcntl.h>
#include <conio.h> // _kbhit _getch _putch
#elif defined __X2LIB_LINUX__
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/procfs.h>  
#include <sys/stat.h>  
#include <sys/time.h>  
#include <sys/vfs.h>  
#include <sys/shm.h>
#include <sys/sem.h>//包含信号量定义的头文件  
#include <sys/stat.h>
//#include <alsa/iatomic.h>  // apt-get install libasound2-dev
#include <arpa/inet.h>  
#include <netinet/ip_icmp.h>  
#include <netinet/in.h>  // socaddr_in
#include <netinet/ip.h>  
#include <netinet/tcp.h>  
#include <dirent.h>  
#include <errno.h>  
#include <sys/ioctl.h> // ioctl
#include <fcntl.h> // ioctl
#include <pthread.h>
#include <unistd.h> //slee
#include <netdb.h>  
#include <sched.h>  
#include <signal.h>  
#include <stropts.h> // 如果提示缺少此头文件，可在/usr/include/新建一个空文件 
#include <stdarg.h>  
#include <termios.h>  
#elif defined __X2LIB_MACOS__
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>  
#include <sys/time.h>  
#include <sys/shm.h>
#include <sys/sem.h>//包含信号量定义的头文件  
#include <sys/stat.h>
//#include <alsa/iatomic.h>  // apt-get install libasound2-dev
#include <arpa/inet.h>  
#include <netinet/in.h>  // socaddr_in
#include <netinet/ip.h>  
#include <netinet/tcp.h>  
#include <dirent.h>  
#include <errno.h>  
#include <sys/ioctl.h> // ioctl
#include <fcntl.h> // ioctl
#include <pthread.h>
#include <unistd.h> //slee
#include <netdb.h>  
#include <sched.h>  
#include <signal.h>  
#include <stdarg.h>  
#include <termios.h>  
#endif

#include <sstream>
#include <random>
#include <string>
#include <vector>
#include <map>
#include <queue>
#include <list>
#include <set>
#include <functional>
#include <mutex>
#include <unordered_map>
#include <unordered_set>
#include <typeindex>
#include <cassert>
#include <memory>
#include <algorithm>
#include <thread>
#include <future>
#include <atomic>
#ifdef __X2LIB_CLOSE__
#include "winapi.h"
#include "defunc.h"
#endif
#include "stdapi.h"


#if defined(__x86_64__) || defined(_WIN64)
typedef int64_t		    intz_t;
typedef uint64_t		uintz_t;
#else
typedef int32_t		    intz_t;
typedef uint32_t		uintz_t;
#endif

// window type to linux
#ifndef __X2LIB_WIN32__
typedef void*			    HANDLE;
typedef void*			    HMODULE;
#if defined(__x86_64__) || defined(_WIN64)
typedef uint64_t		SOCKET;
#else
typedef uint32_t		SOCKET;
#endif

// 在windows，DWORD无论在64位还是32位系统均为32位整型
typedef uint32_t            DWORD;

typedef unsigned int        UINT;
typedef bool                BOOL;
typedef uint8_t             BYTE;
typedef uint16_t            WORD;
//typedef void far            *LPVOID;
typedef void*               LPVOID;
typedef DWORD               WPARAM;
typedef DWORD               LPARAM;

#define MAKEDWORD(a, b)      ((uint32_t)(((uint16_t)(((uint32_t)(a)) & 0xffff)) | ((uint32_t)((uint16_t)(((uint32_t)(b)) & 0xffff))) << 16))
#define MAKEWPARAM(l, h)    ((LPARAM)(uint32_t)MAKEDWORD(l, h))
#define MAKELPARAM(l, h)    ((LPARAM)(uint32_t)MAKEDWORD(l, h))

#define LOWORD(dw)           ((WORD)(((DWORD)(dw)) & 0xffff))
#define HIWORD(dw)           ((WORD)((((DWORD)(dw)) >> 16) & 0xffff))
#define LOBYTE(w)           ((BYTE)(((DWORD)(w)) & 0xff))
#define HIBYTE(w)           ((BYTE)((((DWORD)(w)) >> 8) & 0xff))


#define WINAPI
#ifndef NULL
#define NULL				0
#endif
#ifndef FALSE
#define FALSE               0
#endif
#ifndef TRUE
#define TRUE                1
#endif
#ifndef IN
#define IN
#endif
#ifndef OUT
#define OUT
#endif
#ifndef OPTIONAL
#define OPTIONAL
#endif
#ifndef MAX_PATH
#define MAX_PATH			260
#endif
#ifndef SOCKET_ERROR
#define SOCKET_ERROR		-1
#endif
#endif


#endif
